package com.chixing.day10_hashcode_exception;

public class StudentTest {
    public static void main(String[] args) {
        Student stu1 = new Student("Kirby",20,12347654L);
        Student stu2 = new Student("Kirby",20,12347654L);

        System.out.println(stu1.equals(stu2)); //比较的是地址

        System.out.println((int) ('x' + 'r')); // 234  xr != yq, f(xr) = f(yq) 冲突
        System.out.println((int) ('y' + 'q')); // 234



        // 通过哈希函数得到的一个值
        System.out.println("hello".hashCode()); //99162322
        System.out.println("hellp".hashCode()); //99162323
        System.out.println("helma".hashCode()); //99162339



        Student s1 = new Student("allen", 21, 1399144444L);  // hashcode= 516180939
        Student s2 = new Student("katy", 23, 1399122222L);   // hashcode=297050053
        Student s3 = new Student("Kirby",20,12347654L);  // hashcode= 118544347
        Student s4 = new Student("Kirby",20,12347654L); // hashcode= 118544347

        Student s5 = new Student( "katy", 21, 13991839999L);   // hashcode= 1067704969
        Student s6 = new Student("walter", 22, 13991222222L);   // hashcode= 1067704969

        System.out.println(s1.hashCode());  //115892948
        System.out.println(s2.hashCode());  //115892948
        System.out.println(s3.hashCode());  //1067704969
        System.out.println(s4.hashCode());  //115892948
        System.out.println(s5.hashCode());  //115892948
        System.out.println(s6.hashCode());  //1067704969

        //为什么重写equals
       /* 因为比较两个对象是不是同一个对象，业务中要比较的是内容值，而不是内存地址
       但是Object.equals()比较的还是内存地址
       所以 业务中 需要重写equals方法
*/


        //为什么要重写hashcode
        //因为随着数据量增多（几十万以上的数据），判断容器中是否有该对象，则需要挨个使用equals方法，这样效率会非常低
      /*  通过hash函数来映射对象存储的内存地址
         若该内存上没有元素对象，则新元素就存储在该位置
         若该内存上已有元素，【hash值相同哈希冲突】
          继续equals(),若为true,是同一个对象，若equal()返回false，则新元素要散列到其他空内存位置上


          大大减少了equals()方法的比较次数，从而提高了比较效率
*/


    }

}
